#endif /* CONFIG_SMP */
}
+void
+xen_irq_init(void)
+{
+ struct callback_register event = {
+ .type = CALLBACKTYPE_event,
+ .address = (unsigned long)&xen_event_callback,
+ };
+
+ xen_init_IRQ();
+ BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event));
+ late_time_init = xen_bind_early_percpu_irq;
+#ifdef CONFIG_SMP
+ register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction);
+#endif
+}
+
+void
+xen_platform_send_ipi(int cpu, int vector, int delivery_mode, int redirect)
+{
+ int irq = -1;
+
+#ifdef CONFIG_SMP
+ /* TODO: we need to call vcpu_up here */
+ if (unlikely(vector == ap_wakeup_vector)) {
+ extern void xen_send_ipi (int cpu, int vec);
+
+ /* XXX
+ * This should be in __cpu_up(cpu) in ia64 smpboot.c
+ * like x86. But don't want to modify it,
+ * keep it untouched.
+ */
+ xen_smp_intr_init_early(cpu);
+
+ xen_send_ipi (cpu, vector);
+ //vcpu_prepare_and_up(cpu);
+ return;
+ }
+#endif
+
+ switch (vector) {
+ case IA64_IPI_VECTOR:
+ irq = per_cpu(ipi_to_irq, cpu)[IPI_VECTOR];
+ break;
+ case IA64_IPI_RESCHEDULE:
+ irq = per_cpu(ipi_to_irq, cpu)[RESCHEDULE_VECTOR];
+ break;
+ case IA64_CMCP_VECTOR:
+ irq = per_cpu(ipi_to_irq, cpu)[CMCP_VECTOR];
+ break;
+ case IA64_CPEP_VECTOR:
+ irq = per_cpu(ipi_to_irq, cpu)[CPEP_VECTOR];
+ break;
+ default:
+ printk(KERN_WARNING "Unsupported IPI type 0x%x\n",
+ vector);
+ irq = 0;
+ break;
+ }
+
+ BUG_ON(irq < 0);
+ notify_remote_via_irq(irq);
+ return;
+}
#endif /* CONFIG_XEN */
void
void __init
init_IRQ (void)
{
-#ifdef CONFIG_XEN
- /* Maybe put into platform_irq_init later */
- if (is_running_on_xen()) {
- struct callback_register event = {
- .type = CALLBACKTYPE_event,
- .address = (unsigned long)&xen_event_callback,
- };
- xen_init_IRQ();
- BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event));
- late_time_init = xen_bind_early_percpu_irq;
-#ifdef CONFIG_SMP
- register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction);
-#endif /* CONFIG_SMP */
- }
-#endif /* CONFIG_XEN */
register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
#ifdef CONFIG_SMP
register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
pfm_init_percpu();
#endif
platform_irq_init();
+#ifdef CONFIG_XEN
+ if (is_running_on_xen() && !ia64_platform_is("xen"))
+ xen_irq_init();
+#endif
}
void
unsigned long phys_cpu_id;
#ifdef CONFIG_XEN
- if (is_running_on_xen()) {
- int irq = -1;
-
-#ifdef CONFIG_SMP
- /* TODO: we need to call vcpu_up here */
- if (unlikely(vector == ap_wakeup_vector)) {
- extern void xen_send_ipi (int cpu, int vec);
-
- /* XXX
- * This should be in __cpu_up(cpu) in ia64 smpboot.c
- * like x86. But don't want to modify it,
- * keep it untouched.
- */
- xen_smp_intr_init_early(cpu);
-
- xen_send_ipi (cpu, vector);
- //vcpu_prepare_and_up(cpu);
- return;
- }
-#endif
-
- switch(vector) {
- case IA64_IPI_VECTOR:
- irq = per_cpu(ipi_to_irq, cpu)[IPI_VECTOR];
- break;
- case IA64_IPI_RESCHEDULE:
- irq = per_cpu(ipi_to_irq, cpu)[RESCHEDULE_VECTOR];
- break;
- case IA64_CMCP_VECTOR:
- irq = per_cpu(ipi_to_irq, cpu)[CMCP_VECTOR];
- break;
- case IA64_CPEP_VECTOR:
- irq = per_cpu(ipi_to_irq, cpu)[CPEP_VECTOR];
- break;
- default:
- printk(KERN_WARNING "Unsupported IPI type 0x%x\n",
- vector);
- irq = 0;
- break;
- }
-
- BUG_ON(irq < 0);
- notify_remote_via_irq(irq);
+ if (is_running_on_xen()) {
+ xen_platform_send_ipi(cpu, vector, delivery_mode, redirect);
return;
- }
-#endif /* CONFIG_XEN */
+ }
+#endif
#ifdef CONFIG_SMP
phys_cpu_id = cpu_physical_id(cpu);
#ifndef _ASM_IA64_MACHVEC_XEN_h
#define _ASM_IA64_MACHVEC_XEN_h
-extern ia64_mv_setup_t dig_setup;
+extern ia64_mv_setup_t xen_setup;
+extern ia64_mv_cpu_init_t xen_cpu_init;
+extern ia64_mv_irq_init_t xen_irq_init;
+extern ia64_mv_send_ipi_t xen_platform_send_ipi;
extern ia64_mv_dma_alloc_coherent xen_alloc_coherent;
extern ia64_mv_dma_free_coherent xen_free_coherent;
extern ia64_mv_dma_map_single xen_map_single;
* the macros are used directly.
*/
#define platform_name "xen"
-#define platform_setup dig_setup
+#define platform_setup xen_setup
+#define platform_cpu_init xen_cpu_init
+#define platform_irq_init xen_irq_init
+#define platform_send_ipi xen_platform_send_ipi
#define platform_dma_init machvec_noop
#define platform_dma_alloc_coherent xen_alloc_coherent
#define platform_dma_free_coherent xen_free_coherent